/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * PainelCodigo.java
 *
 * Created on 18/06/2009, 14:15:20
 */
package compilador.GUI;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.DefaultListModel;
import javax.swing.JList;
import javax.swing.JTextPane;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

/**
 *
 * @author Igor
 */
public class PainelCodigo extends javax.swing.JPanel {

    
    DefaultListModel model;
    private AreaTexto area = new AreaTexto();
    ArrayList<String> reservadas = new ArrayList<String>();

    /** Creates new form PainelCodigo */
    public PainelCodigo(Dimension d) {

        setSize(d.width - 15, d.height - 100); //ajustando tamanho da tela
        initComponents();
        setaTamanhoAreaTexto(); //ajusta tamanho da área de digitação
        inicializaReservadas(); //inicializa array com palavras reservadas para comparar
        startListaLinhas(); //inicializa régua de linhas
        repaint();

    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jScrollPane1 = new javax.swing.JScrollPane();
        PainelTexto = new javax.swing.JTextPane();
        jPanel1 = new javax.swing.JPanel();
        jScrollPane2 = new javax.swing.JScrollPane();
        ListaLinhas = new javax.swing.JList();

        setBackground(new java.awt.Color(218, 218, 240));
        setBorder(javax.swing.BorderFactory.createLineBorder(new java.awt.Color(0, 0, 0)));

        PainelTexto.addCaretListener(new javax.swing.event.CaretListener() {
            public void caretUpdate(javax.swing.event.CaretEvent evt) {
                PainelTextoCaretUpdate(evt);
            }
        });
        PainelTexto.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                PainelTextoKeyPressed(evt);
            }
            public void keyReleased(java.awt.event.KeyEvent evt) {
                PainelTextoKeyReleased(evt);
            }
            public void keyTyped(java.awt.event.KeyEvent evt) {
                PainelTextoKeyTyped(evt);
            }
        });
        jScrollPane1.setViewportView(PainelTexto);

        ListaLinhas.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION);
        jScrollPane2.setViewportView(ListaLinhas);

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 41, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE)
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 364, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 350, Short.MAX_VALUE)
        );
    }// </editor-fold>//GEN-END:initComponents

    private void PainelTextoKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_PainelTextoKeyPressed
        //evento relacionado ao presssionamento de teclas na área de texto
        ajustaLinhas(); //ajusta régua de linhas
        if (evt.getKeyCode() == KeyEvent.VK_SPACE) {
            pintaReservadas(); //sempre que apertar espaço, checa se palavra é reservada para pintar de azul
        }
        ListaLinhas.repaint();
    }//GEN-LAST:event_PainelTextoKeyPressed

    private void PainelTextoKeyTyped(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_PainelTextoKeyTyped
        ajustaLinhas();//ajusta régua de linhas
    }//GEN-LAST:event_PainelTextoKeyTyped

    private void PainelTextoKeyReleased(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_PainelTextoKeyReleased
        ajustaLinhas();//ajusta régua de linhas
    }//GEN-LAST:event_PainelTextoKeyReleased

    private void PainelTextoCaretUpdate(javax.swing.event.CaretEvent evt) {//GEN-FIRST:event_PainelTextoCaretUpdate
        ajustaLinhas();//ajusta régua de linhas
    }//GEN-LAST:event_PainelTextoCaretUpdate

    public void inicializaReservadas() {
        //inicializa array de reservadas para comparar
        reservadas.add(new String("algoritmo"));
        reservadas.add(new String("caracter"));
        reservadas.add(new String("constantes"));
        reservadas.add(new String("enquanto"));
        reservadas.add(new String("entao"));
        reservadas.add(new String("escreva"));
        reservadas.add(new String("falso"));
        reservadas.add(new String("funcao"));
        reservadas.add(new String("inteiro"));
        reservadas.add(new String("leia"));
        reservadas.add(new String("logico"));
        reservadas.add(new String("para"));
        reservadas.add(new String("escreva"));
        reservadas.add(new String("principal"));
        reservadas.add(new String("registro"));
        reservadas.add(new String("retorno"));
        reservadas.add(new String("se"));
        reservadas.add(new String("tipo"));
        reservadas.add(new String("variaveis"));
        reservadas.add(new String("vazio"));
        reservadas.add(new String("verdadeiro"));
        reservadas.add(new String("real"));
        reservadas.add(new String("senao"));
    }


    public void setaTamanhoAreaTexto() {
        this.PainelTexto.setSize(new Dimension(this.getSize())); //ajusta tamanho da tela de digitação

    }

    public JTextPane getAreaTexto() {
        return PainelTexto;
    }

     public void startListaLinhas() {

        model = new DefaultListModel(); //instancia um model para Jlist
        ListaLinhas.setModel(model); //seta model instanciado como referente à régua de linhas
        ListaLinhas.setFixedCellHeight(area.getEspacoLinhas()); //seta espaçamento entre linhas
        model.addElement(1); //inicia régua com 1 linha já criada
    }

    public JList getListaLinhas() {
        return ListaLinhas;
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JList ListaLinhas;
    private javax.swing.JTextPane PainelTexto;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    // End of variables declaration//GEN-END:variables

    private void pintaReservadas() {
        String[] texto = PainelTexto.getText().split("[ ,\n]"); //divite texto principal com base em espaços e quebras de linha

        StyledDocument doc = PainelTexto.getStyledDocument(); //recupera estilo do painel de texto
        javax.swing.text.Style style = PainelTexto.addStyle("Blue", null); //cria um novo estilo
        StyleConstants.setForeground(style, Color.blue); //seta cor desse novo estilo como azul

        for (int i = 0; i < texto.length; i++) {
            if (reservadas.contains(texto[i])) { //compara texto com reservadas
                int c = texto[i].length();
                doc.setCharacterAttributes(PainelTexto.getText().lastIndexOf(texto[i]), c, PainelTexto.getStyle("Blue"), true);
                //pinta reservadas com base no seu deslocamento e tamanho dentro do textos usando o estilo criado acima
            }
        }

    }

    public void ajustaLinhas() {
        model = (DefaultListModel) this.getListaLinhas().getModel(); //recupera model da régua de linhas
        model.removeAllElements(); //remove todos os elementos do modelo
        int count = 0;

        String tex[] = this.getAreaTexto().getText().split("\n"); //cria vetor com número de elementos igual ao número de linhas

        for (int i=0;i<tex.length;i++) {
                count++;
                model.addElement(count); //adiciona cada quebra de linha como contador para o número de linhas
        }

    }


}
